home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 2
/
Atari Mega Archive CD - Volume 2.iso
/
8bit
/
cislib_a
/
epson.act
< prev
next >
Wrap
Text File
|
1995-04-22
|
9KB
|
443 lines
;++++++++++++++++++++++++++++++++++++
; EPSON/ATASCII PRINT FORMATTER
; Prints listed BASIC programs and
; text using Epson bit mode graphics
; to print non-ASCII characters
;
; With suitable changes to the Epson
; specific variables immediately
; below, this program will work with
; a number of other graphic printers.
;
; (c)1983 Leo G. Laporte
; BOX 21248
; San Jose, CA 95151
; CIS PPN # 70215,1022
; Placed in public domain 12/8/83.
;++++++++++++++++++++++++++++++++++++
BYTE rts = [$60], ; OSA+ bug fix
bank = $D500 ; Atari DOS bug fix
MODULE
DEFINE TRUE="1",
FALSE="0",
BOOL="BYTE",
KEY = "0",
FILE = "1",
EPSON = "2",
MAXLINE = "55" ; max # of lines per page
; Epson specific stuff
CHAR ARRAY grmode = [4 27 75 8 0],
; initializes bit-mode graphics (ESC K 8 0)
; and tells printer that eight graphic
; data bytes will follow.
italics_on = [2 27 '4], ; if you have an older Epson w/o italics
italics_off = [2 27 '5] ; change these strings to another suitable font
CHAR formfeed = [12]
;------------------------------------
; PROCEDURE DECLARATIONS
;------------------------------------
PROC grprint(CHAR chr)
; does a graphic print of non-ASCII
; characters
BYTE ARRAY mask =[128 64 32 16 8 4 2 1], ; bit values D7 to D0
CHARSET = $E000, ; location of character set in ROM
grdata(8) ; character data array
BYTE offset, ; current character data byte
bit, ; current bit in byte
byt ; graphic data byte
BOOL bit_set, ; is bit set? flag
inv_flag ; inverse char?
CARD charloc ; location of character data
; check for inverse character
IF (chr & 128) THEN
inv_flag = TRUE
chr ==& 127 ; strip off inverse bit
ELSE
inv_flag = FALSE
FI
; find character data in ROM
IF chr < 32 THEN
charloc = (chr + 64) * 8
ELSEIF chr > 31 AND chr < 96 THEN
charloc = (chr - 32) * 8
ELSE
charloc = chr * 8
FI
; rotate char data for Epson
Zero(grdata, 8) ; clear character graphics data
FOR offset = 0 TO 7 ; step through char data
DO
FOR bit = 0 TO 7
DO
bit_set = CHARSET(charloc + offset) & mask(bit)
IF inv_flag THEN
IF bit_set = FALSE THEN
grdata(bit) ==+ mask(offset)
FI
ELSEIF bit_set THEN
grdata(bit) ==+ mask(offset)
FI
OD
OD
; dump character data
PrintD(EPSON, grmode)
FOR byt = 0 TO 7
DO
IF grdata(byt) = 155 THEN ;prevent sending CR and thereby
grdata(byt) = 151 ;cancelling graphics mode (only
FI ; occurs during printing of inverse A)
PutD(EPSON, grdata(byt))
OD
RETURN
;-----------------------------------
PROC feed(BYTE lines)
; feeds "lines" lines
BYTE i
FOR i = 1 TO lines
DO
PutDE(EPSON)
OD
RETURN
;------------------------------------
PROC indent(BYTE col)
; tabs to col
BYTE space = [32], i
FOR i = 1 TO col
DO PutD(EPSON, space) OD
RETURN
;------------------------------------
BYTE FUNC PrintTEXT(CHAR ARRAY line)
; prints TEXT input line
CHAR eol = [155],
chr
BYTE cnt, col
CARD linecnt ; number of lines output
cnt = 1 ; current character in line
col = 0 ; current printer column
linecnt = 0 ; lines printed
chr = line(cnt)
IF chr = eol THEN
PutDE(EPSON)
RETURN (1)
FI
WHILE chr <> eol
DO
IF ; printable character
(chr > 31 AND chr < 123 AND chr <> 96) THEN
PutD(EPSON, chr)
col ==+ 1
ELSE
grprint(chr)
col ==+ 2
FI
IF (col > 80) THEN
PutDE(EPSON)
linecnt ==+ 1
col = 0
FI
cnt ==+ 1
chr = line(cnt) ; get next char
OD
PutDE(EPSON)
linecnt ==+ 1
RETURN (linecnt)
;------------------------------------
BYTE FUNC PrintBASIC(CHAR ARRAY line)
; prints BASIC input line
CHAR space = [32],
invsp = [160],
colon = [58],
semic = [59],
eol = [155],
quote = [34],
comma = [44],
chr
BYTE cnt, col, tab
BOOL inquotes
CARD linecnt ; number of lines output
cnt = 1 ; current character in line
col = 0 ; current printer column
linecnt = 0 ; lines printed
inquotes = FALSE
chr = line(cnt)
IF chr = eol THEN RETURN (0) FI
; drop leading spaces...
WHILE chr = space
DO
cnt ==+ 1
chr = line(cnt)
OD
; print line number...
WHILE (chr >= '0 AND chr <= '9)
DO
PutD(EPSON, chr)
col ==+ 1
cnt ==+ 1
chr = line(cnt)
OD
; output a space...
IF chr = space THEN
PutD(EPSON, chr)
cnt ==+ 1
chr = line(cnt)
ELSE PutD(EPSON, space)
FI
col ==+ 1
; set tab...
tab = col
; now print rest of line...
WHILE chr <> eol
DO
IF chr = quote THEN
IF inquotes THEN
inquotes = FALSE
ELSE
inquotes = TRUE
FI
FI
IF ; printable character
(chr > 31 AND chr < 123 AND chr <> 96) THEN
PutD(EPSON, chr)
col ==+ 1
ELSE
grprint(chr)
col ==+ 2
FI
; should we break line?...
IF
(col > 65 AND ; close to R margin
(chr = space OR ; break line
chr = invsp OR ; at a logical
chr = comma OR ; spot if
chr = semic)) ; possible
OR
(chr = colon AND inquotes = FALSE) ; separate BASIC commands
OR
(col > 80) ; unconditional line break
; yes...
THEN
PutDE(EPSON)
linecnt ==+ 1
indent(tab)
col = tab
; no...
FI
cnt ==+ 1
chr = line(cnt) ; get next char
OD
feed(2) ; end of input line
linecnt ==+ 2
RETURN (linecnt)
;-------------------------------------
PROC main()
CHAR ARRAY source(20),
title1(75),
title2(75),
choice(10),
line(255)
BYTE consol = $D01F, ; start key
invflg = $2B6, ; inverse off
shflok = $2BE, ; shift lock
crsinh = $2F0, ; cursor off
linecnt, linetot
CARD page = [1] ; pages printed
BOOL basic
Bank = 0
Put(125) ; clear screen
Setcolor(2,12,2)
PutE()
PrintE(" EPSON/ATASCII PRETTY PRINTER")
PrintE(" (c)1983 Leo G. Laporte")
PutE()
PrintE(" File must be LISTed BASIC or TEXT")
PutE()
Print("Enter source file > ")
invflg = 0 ; inverse off
shflok = 64 ; caps lock
InputS(source)
PutE()
PrintE("Enter header line #1 (max 75 chars)")
Print(">")
InputMD(KEY, title1, 75)
PutE()
PrintE("Enter header line #2")
Print(">")
InputMD(KEY, title2, 75)
PutE()
Print("Is this a (B)ASIC or (T)ext file? ")
invflg = 0 ; inverse off
shflok = 64 ; caps lock
InputMD(KEY, choice, 10)
IF choice(1) = 'T THEN
basic = FALSE
ELSE
basic = TRUE
FI
Position(2,22)
crsinh = 1
Print(" PRESS -START- TO BEGIN PRINTING")
Position(2, 17)
consol = 8
WHILE consol <> 6 ; wait for start
DO
consol = 0
OD
Close(FILE) Close(EPSON)
Open(FILE, source, 4)
Open(EPSON, "P:", 8)
PutDE(EPSON)
PrintD(EPSON, italics_on)
PrintDE(EPSON, title1)
PrintDE(EPSON, title2)
PrintD(EPSON,"Page ") PrintCDE(EPSON, page)
PrintD(EPSON, italics_off)
feed(2)
linetot = 6
InputMD(FILE, line, 255)
WHILE EOF(FILE) = FALSE
DO
IF basic THEN
linecnt = PrintBASIC(line)
ELSE
linecnt = PrintTEXT(line)
FI
linetot ==+ linecnt
IF linetot >= MAXLINE THEN ; next page
PutD(EPSON, formfeed)
page ==+ 1
PrintD(EPSON, italics_on)
PrintDE(EPSON, title1)
PrintDE(EPSON, title2)
PrintD